#ifndef _REDIS_POOL_H
#define _REDIS_POOL_H

#include "my_redis.h"
#include <list>

#include <atomic>
#include <pthread.h>    //采用这种锁，使得该池子并不具备跨平台的特性

//这些信息可以考虑写进配置文件里去
#define REDIS_NUM 10            //实例化的个数
#define IP "192.168.174.139"
#define PORT 6380
#define PASSWORD "Root1234!"
class redis_pool{
public:

    MyRedis* get_one_redis();
    bool give_back_one_redis(MyRedis *);   //这里需不需要考虑重复放入问题---采用set结构解决

    static redis_pool * get_instance(){
        
        if(redis_pool::pool==nullptr){
            static for_redis_pool aaaa;
            pool=new redis_pool();
            
        }
        return pool;
    }

    ~redis_pool();
private:
    //做一个内部类
    class for_redis_pool{
    public:
        ~for_redis_pool(){
            if(redis_pool::pool!=nullptr){
                delete redis_pool::pool;
                redis_pool::pool=nullptr;
            }
        }
    };
    
    static redis_pool * pool;   
    int redis_pool_sizes;
    redis_pool();  //这个表示你要多少个redis连接实例
    redis_pool(const redis_pool &redis)=delete; //禁用拷贝构造
    redis_pool & operator=(const redis_pool & redis)=delete;    //禁用等号赋值
    MyRedis *create_one_redis(const char *ip="192.168.174.176",int port=6379);
    std::list<MyRedis *> redis_list;   //真实意义上的池子--这里为什么要用set容器？？？---解决重复放回问题，但是目前并不完善
    std::atomic<int> redis_list_num;    // 真实成功连接的数量
    std::atomic<bool> is_close; //是否释放连接
    pthread_mutex_t  pool_mutex;
};




#endif